import { mergeAttributes, Node } from '@tiptap/core'

export interface CustomNodeOptions {
  HTMLAttributes: Record<string, any>,
}

declare module '@tiptap/core' {
  interface Commands<ReturnType> {
    custom: {
      /**
       * Toggle a paragraph
       * @example editor.commands.toggleParagraph()
       */
      setCustom: () => ReturnType,
    }
  }
}

export const CustomNode = Node.create<CustomNodeOptions>({
  name: 'custom',
  // 优先级，默认100，值越大优先级越高，具有更高优先级的扩展将更早加载。
  priority: 1000,
  addOptions() {
    return {
      HTMLAttributes: {
        // contenteditable: false,
      },
    }
  },
  // [block|inline|block list]
  group: 'block',
  // 准确地定义了节点可以拥有什么样的内容，以下取值示例
  // 必须有一个或多个blocks
  // content: 'block+',
  // 必须有零个或多个blocks
  // content: 'block*',
  // 允许各种类型的‘内联’内容（文本或硬换行）
  // content: 'inline*',
  // 除‘文本’之外，不得包含任何其他内容
  // content: 'text*',
  // 可以有一个或多个段落，或者列表（如果使用列表的话）
  // content: '(paragraph|list?)+',
  // 顶部必须恰好有一个标题，下方有一个或多个块
  // content: 'heading block+',
  content: 'inline*',
  // 函数尝试从超文本标记语言加载编辑器文档。该函数获取作为参数传递的超文本标记语言DOM元素，并期望返回一个带有属性及其值的对象。
  parseHTML() {
    return [
      { tag: 'tt' },
    ]
  },
  // 渲染HTML
  renderHTML({ HTMLAttributes }) {
    return ['div', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {'data-type': 'custom-node'}), 0]
  },
  // 扩展命令
  addCommands() {
    return {
      setCustom: () => ({ commands }) => {
        return commands.setNode(this.name)
      },
    }
  },
  // 扩展快捷键
  addKeyboardShortcuts() {
    return {
      // 'Mod-Alt-0': () => this.editor.commands.setCustom(),
    }
  },
})

export default CustomNode